﻿@page "/ru/5.8/use-cases/modbus-protocol"
@{
    Layout = "_ArticleLayout";
    ViewBag.Title = "Подключение устройств по протоколу Modbus";
}

@section Styles {
    <link href="~/lib/prismjs/prism.css" rel="stylesheet" />
}

@section Scripts {
    <script src="~/lib/prismjs/prism.js"></script>
}

<nav class="doc-toc">
    <div class="h6">На этой странице</div>
    <hr>
    <ul>
        <li><a href="#creating-project">Создание проекта</a></li>
        <li><a href="#database-configuration">Предварительная настройка базы конфигурации</a></li>
        <li><a href="#configuring-communication">Настройка обмена данными с устройствами</a></li>
        <li><a href="#creating-channels">Создание каналов</a></li>
        <li><a href="#customizing-interface">Настройка интерфейса оператора</a></li>
        <li><a href="#tags-conversion">Преобразование значений тегов Modbus</a></li>
    </ul>
</nav>

<div class="doc-content">
    <h1>Подключение устройств по протоколу Modbus</h1>

    <p>На рынке представлено огромное количество устройств, работающих в самых разных областях автоматизации, которые поддерживают обмен данными по протоколу <a href="https://ru.wikipedia.org/wiki/Modbus" target="_blank">Modbus</a>. Modbus - это открытый коммуникационный протокол, использующий клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа. Реализация поддержки протокола Modbus комплексом Rapid SCADA на порядок расширяет перечень устройств, с которыми может работать комплекс. Поддерживаются следующие режимы передачи данных: RTU, ASCII, TCP.</p>

    <p>Общая последовательность настройки:</p>

    <ol>
        <li>Создать проект с помощью программы Администратор.</li>
        <li>Создать новый объект, линию связи и КП.</li>
        <li>Настроить обмен данными между Коммуникатором и устройствами.</li>
        <li>Создать входные каналы в базе конфигурации, соответствующие элементам Modbus (элементы также называются переменными или тегами). Создать каналы управления, соответствующие командам.</li>
        <li>Создать одно или несколько представлений (таблиц или схем) для отображения информации в приложении Вебстанция. Прописать представления в базе конфигурации.</li>
    </ol>

    <p>Далее приводится пошаговое описание подключения нового Modbus устройства.</p>

    <h2 id="creating-project">Создание проекта</h2>

    <p>В Администраторе нажмите конпку <em>Новый проект</em>, в открывшемся окне введите наименование проекта и нажмите кнопку <em>OK</em>. Чтобы процесс настройки полностью совпадал с текстом статьи, необходимо использовать пустой проект EmptyProject.ru-RU в качестве шаблона.</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_new_proj_ru.png" class="figure-img img-fluid" alt="Создание проекта" />
        <figcaption class="figure-caption">Рис. 1. Создание проекта</figcaption>
    </figure>

    <h2 id="database-configuration">Предварительная настройка базы конфигурации</h2>

    <p>Разверните узел проводника проекта <em>База конфигурации</em>, откройте таблицу <em>Объекты</em> и добавьте новую строку для объекта 2 "Тестовый объект" (рис. 2). Щёлкните по кнопке <img src="../common-images/add_line.png" /> на панели инструментов, чтобы открыть мастер добавления линии связи. С помощью мастера создайте линию связи 1 "Тестовая линия" (рис. 3). Затем нажмите кнопку <img src="../common-images/add_device.png" /> и добавьте КП 1 "Тестовый КП" (рис. 4).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_add_obj_ru.png" class="figure-img img-fluid" alt="Добавление объекта" />
        <figcaption class="figure-caption">Рис. 2. Добавление объекта</figcaption>
    </figure>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_add_line_ru.png" class="figure-img img-fluid" alt="Добавление линии связи" />
        <figcaption class="figure-caption">Рис. 3. Добавление линии связи</figcaption>
    </figure>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_add_device_ru.png" class="figure-img img-fluid" alt="Добавление КП" />
        <figcaption class="figure-caption">Рис. 4. Добавление КП</figcaption>
    </figure>

    <p>Обратите внимание на заполнение следующих полей при добавлении КП:</p>

    <dl class="row">
        <dt class="col-sm-3">Тип КП</dt>
        <dd class="col-sm-9">Modbus</dd>

        <dt class="col-sm-3">Адрес</dt>
        <dd class="col-sm-9">Modbus адрес Вашего устройства, например, 1</dd>

        <dt class="col-sm-3">Позывной</dt>
        <dd class="col-sm-9">IP-адрес, если устройство подключено по сети Ethernet. В противном случае, пустой</dd>

        <dt class="col-sm-3">Линия связи</dt>
        <dd class="col-sm-9">"Тестовая линия", которая была только что создана</dd>
    </dl>

    <p>Откройте таблицы <em>Линии связи</em> и <em>КП</em> базы конфигурации, чтобы проверить, что созданная линия связи и КП успешно добавлены в таблицы. Убедитесь, что соответствующая линия связи и КП созданы в настройках Коммуникатора.</p>

    <h2 id="configuring-communication">Настройка обмена данными с устройствами</h2>

    <p>В проводнике проекта перейдите в настройки Коммуникатора, разверните узел созданной линии связи и дважды щёлкните по элементу <em>Параметры линии</em>. На странице основных параметров необходимо настроить канал связи (рис. 5). Для протокола Modbus обычно используется канал <em>TCP-клиент</em> или <em>Последовательный порт</em>.</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_line_main_ru.png" class="figure-img img-fluid" alt="Основные параметры линии связи" />
        <figcaption class="figure-caption">Рис. 5. Основные параметры линии связи</figcaption>
    </figure>

    <p>Если обмен данными выполняется через последовательный порт, то типичные параметры последовательного порта в зависимости от типа протокола Modbus указаны в таблице ниже. В режимах RTU и ASCII необходимо установить одинаковую скорость передачи данных в Коммуникаторе и на устройствах. На одной линии связи все устройства должны работать по протоколу Modbus одного типа и с одной скоростью.</p>

    <table class="table table-hover">
        <thead>
            <tr>
                <th>Modbus RTU</th>
                <th>Modbus ASCII</th>
                <th>Modbus TCP</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>8 битов данных,<br />с проверкой чётности (even – чёт.),<br />1 стоп-бит</td>
                <td>7 битов данных,<br />с проверкой чётности (even – чёт.),<br />1 стоп-бит</td>
                <td>-</td>
            </tr>
            <tr>
                <td>8 битов данных,<br />без проверки чётности,<br />2 стоп-бита</td>
                <td>7 битов данных,<br />без проверки чётности,<br />2 стоп-бита</td>
                <td>-</td>
            </tr>
        </tbody>
    </table>

    <p>Далее перейдите на страницу <em>Опрос КП</em> и выберите в таблице "Тестовый КП" (рис. 6). Если не указывать время или период опроса КП, то опрос устройств производится циклически. Команды отправляются сразу после завершения очередного опроса.</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_line_req_ru.png" class="figure-img img-fluid" alt="Таблица опроса КП" />
        <figcaption class="figure-caption">Рис. 6. Таблица опроса КП</figcaption>
    </figure>

    <p>Нажмите кнопку <em>Свойства</em>, чтобы открыть форму настройки дополнительных свойств КП (рис. 7). На форме свойств КП необходимо выбрать тип протокола Modbus, который должен быть указан в документации на устройство. В нашем случае Modbus TCP.</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_device_props_ru.png" class="figure-img img-fluid" alt="Свойства КП" />
        <figcaption class="figure-caption">Рис. 7. Свойства КП</figcaption>
    </figure>

    <p>Нажмите кнопку <img src="../common-images/open.png" />, чтобы выбрать существующий шаблон устройства, или кнопку <img src="../common-images/blank.png" />, чтобы создать новый шаблон. При нажатии на кнопку создания <img src="../common-images/blank.png" /> или на кнопку редактирования шаблона <img src="../common-images/edit.png" /> вызывается <em>Редактор шаблонов устройств</em> (рис. 8). В данной статье используется существующий шаблон KpModbus_Adam6015.xml, который был предварительно скопирован в директорию проекта C:\SCADA\Projects\ModbusTest\Instances\Default\ScadaComm\Config\</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_template_ru.png" class="figure-img img-fluid" alt="Редактор шаблонов устройств" />
        <figcaption class="figure-caption">Рис. 8. Редактор шаблонов устройств</figcaption>
    </figure>

    <p>Шаблон устройства отражает структуру пакетов данных протокола Modbus. Данные, запрашиваемые от устройства, объединены в группы элементов (тегов). Группа элементов описывается наименованием, таблицей данных, адресом и количеством элементов. Для команд, если они поддерживаются устройством, необходимо задать наименование, таблицу данных, адрес и номер команды КП (от 1 и далее по порядку).</p>

    <p>Наименования элементов и команд могут быть произвольными. Таблицы данных и адреса элементов должны содержаться в документации на подключаемое устройство. В зависимости от производителя адресация элементов может начинаться с 0 или с 1, указываться в 10-чной или 16-ричной системе. По умолчанию в шаблоне выбрана адресация с 1 в 10-чной системе. Чтобы переключить адресацию шаблона, нажмите на кнопку <img src="../common-images/settings.png" />. Откроется диалоговое окно настроек шаблона (рис. 9).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_template_settings_ru.png" class="figure-img img-fluid" alt="Настройки шаблона" />
        <figcaption class="figure-caption">Рис. 9. Настройки шаблона</figcaption>
    </figure>

    <p>Завершив редактирование свойств КП (рис. 7), нажмите кнопку <em>OK</em>. В поле <em>Командная строка</em> в свойствах КП запишется имя файла шаблона KpModbus_Adam6015.xml. Передайте проект на сервер с помощью кнопки <img src="../common-images/upload.png" />.</p>

    <p>В проводнике проекта дважды щёлкните элемент дерева, соответствующий КП, чтобы проверить состояние КП и наличие данных (рис. 10). Данные для работы примера предоставлялись с помощью Modbus Simulator (mod_RSsim.exe).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_data_ru.png" class="figure-img img-fluid" alt="Данные КП" />
        <figcaption class="figure-caption">Рис. 10. Данные КП</figcaption>
    </figure>

    <p>При отсутствии связи с устройством используйте журнал линии связи для поиска причины проблемы. Чтобы открыть журнал, дважды щёлкните по элементу дерева <em>Статистика линии</em>, в открывшемся окне перейдите на страницу <em>Журнал линии</em>. С помощью онлайн инструмента <a href="https://modbus.rapidscada.net/" target="_blank">Online Modbus Parser</a> можно получить расшифровку пакетов данных, скопировав их на веб-форму из журнала линии связи.</p>

    <h2 id="creating-channels">Создание каналов</h2>

    <p>После того, как связь с устройством установлена, необходимо создать входные каналы и каналы управления в базе конфигурации. Наиболее удобный способ создания каналов - использовать мастер, вызываемый кнопкой <img src="../common-images/create_cnls.png" />. Если в систему добавляется несколько однотипных устройств, то ускорить работу можно с помощью инструмента клонирования каналов.</p>

    <p>Выполните шаги мастера (рис. 11-13), выбрав из выпадающих списков созданные ранее линию связи, КП и объект. Чтобы проверить, какие номера каналов доступны, используйте карту каналов на шаге 3.</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_create_cnls1_ru.png" class="figure-img img-fluid" alt="Создание каналов. Шаг 1" />
        <figcaption class="figure-caption">Рис. 11. Создание каналов. Шаг 1</figcaption>
    </figure>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_create_cnls2_ru.png" class="figure-img img-fluid" alt="Создание каналов. Шаг 2" />
        <figcaption class="figure-caption">Рис. 12. Создание каналов. Шаг 2</figcaption>
    </figure>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_create_cnls3_ru.png" class="figure-img img-fluid" alt="Создание каналов. Шаг 3" />
        <figcaption class="figure-caption">Рис. 13. Создание каналов. Шаг 3</figcaption>
    </figure>

    <p>При нажатии на кнопку <em>Создать</em> каналы будут созданы. Каналы создаются автоматически на основе шаблона устройства, который был создан и назначен КП в предыдущем разделе статьи. Посмотреть созданные каналы можно, открыв таблицу базы конфигурации <em>Входные каналы &gt; Тестовый КП</em> или <em>Каналы управления &gt; Тестовый КП</em>. Рекомендуется вручную заполнить поля <em>Величина</em> и <em>Размерность</em> для входных каналов и поле <em>Значения команды</em> для каналов управления. Однако в случае первого опыта это делать необязательно. Полезно понимать, что входные каналы привязываются к тегам КП с помощью поля <em>Сигнал</em>. Каналы управления привязываются к командам КП в соответствии с полем <em>Номер команды</em>.</p>

    <p>После того, как редактирование базы конфигурации завершено, следует передать проект на сервер с помощью кнопки <img src="../common-images/upload.png" />. Теперь откройте страницу данных КП в настройках Коммуникатора и убедитесь, что созданные входные каналы связаны с тегами КП – столбец <em>Канал</em> должен содержать номера созданных входных каналов (рис. 14).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_data_bound_ru.png" class="figure-img img-fluid" alt="Данные КП с привязкой каналов" />
        <figcaption class="figure-caption">Рис. 14. Данные КП с привязкой каналов</figcaption>
    </figure>

    <p>В результате проделанных действий данные должны собираться с устройства и сохраняться в архив. Осталось настроить пользовательский интерфейс оператора.</p>

    <h2 id="customizing-interface">Настройка интерфейса оператора</h2>

    <p>Рассмотрим создание табличного представления для приложения Вебстанция. Если необходимо отобразить данные на мнемосхеме, действия по созданию представления будут аналогичны.</p>

    <p>Щёлкните правой кнопкой на узле <em>Интерфейс</em> проводника проекта. Сначала в контекстном меню выберите <em>Создать папку</em> и создайте папку ModbusTest. Затем в контекстном меню созданной папки выберите <em>Создать файл</em> (рис. 15). В открывшемся окне установите табличный тип представления, укажите имя файла ModbusDevice.tbl и нажмите кнопку <em>OK</em> (рис. 16).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_interface_menu_ru.png" class="figure-img img-fluid" alt="Меню для создания представления" />
        <figcaption class="figure-caption">Рис. 15. Меню для создания представления</figcaption>
    </figure>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_interface_file_ru.png" class="figure-img img-fluid" alt="Диалог для создания представления" />
        <figcaption class="figure-caption">Рис. 16. Диалог для создания представления</figcaption>
    </figure>

    <p>Созданный файл представления появится в проводнике проекта. По двойному щелчку на файле откроется <a href="../software-overview/applications#table-editor-application">Редактор таблиц</a>. Необходимо ввести заголовок и заполнить элементы представления, как показано на рис. 17. Сохраните изменения и закройте редактор.</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_table_editor_ru.png" class="figure-img img-fluid" alt="Редактирование представления" />
        <figcaption class="figure-caption">Рис. 17. Редактирование представления</figcaption>
    </figure>

    <p>После того, как файл представления создан, необходимо прописать в таблице <em>Интерфейс</em> базы конфигурации родительскую директорию и файл представления (рис. 18).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_interface_table_ru.png" class="figure-img img-fluid" alt="Добавление представления в таблицу Интерфейс" />
        <figcaption class="figure-caption">Рис. 18. Добавление представления в таблицу Интерфейс</figcaption>
    </figure>

    <p>Передайте проект на сервер с помощью кнопки <img src="../common-images/upload.png" />. Теперь запустите браузер и введите адрес <a href="http://localhost/scada/" target="_blank">http://localhost/scada/</a>. На форме входа в систему используйте логин admin и пароль 12345 (рис. 19). Если настройка выполнена правильно, то после входа в систему Вам будет доступна таблица с получаемыми от устройства данными (рис. 20).</p>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_web1_ru.png" class="figure-img img-fluid" alt="Вход в систему" />
        <figcaption class="figure-caption">Рис. 19. Вход в систему</figcaption>
    </figure>

    <figure class="figure">
        <img src="modbus-protocol-files/modbus_web2_ru.png" class="figure-img img-fluid" alt="Приложение Вебстанция" />
        <figcaption class="figure-caption">Рис. 20. Приложение Вебстанция</figcaption>
    </figure>

    <h2 id="tags-conversion">Преобразование значений тегов Modbus</h2>

    <p>Каждый элемент Modbus, относящийся к таблицам Input Register и Holding Registers, состоит из двух байт. В зависимости от установленного для элемента типа полученные от устройства данные преобразуются в значение по-разному.</p>

    <p>Если выбран 4-х байтный тип (uint, int, float), то значение элемента получается в результате преобразования 2-х элементов с идущими подряд адресами. Если выбран 8-и байтный тип (ulong, long, double), то значение получается в результате преобразования 4-х элементов.</p>

    <p>Кроме того, можно задать порядок байт, в котором зашифровано значение, т.к. для различных устройств порядок байт может отличаться.</p>

    <p>В ряде случаев для получения вещественных или отрицательных величин потребуется пересчёт, который выполняется Сервером.  Способ пересчёта зависит от используемого устройства и должен указываться его производителем. Два распространённых варианта пересчёта для 2-х байтных значений без знака (ushort) приводятся ниже.</p>

    <h3>Вариант 1. Пропорциональный пересчёт</h3>

    <p>Пусть требуемое вещественное значение изменяется в диапазоне от A до B, X - полученное от устройства целое значение. Тогда пересчёт выполняется по следующей формуле:</p>

    <p>X * (B - A) / 65536 + A.</p>

    <p>Формулу следует ввести в поле Формула входного канала в базе конфигурации, установив для данного канала признак Исп. формулу. Например, значение измеряемого параметра изменяется в диапазоне от -40 до 160. Тогда формула для ввода в базу конфигурации получится:</p>

    <p>Cnl*200/65536-40</p>

    <h3>Вариант 2. Использование дополнительного кода</h3>

    <p>Дополнительная информация о дополнительном коде (two’s complement) доступна на <a href="https://ru.wikipedia.org/wiki/Дополнительный_код" target="_blank">Википедии</a>.</p>

    <p>Пусть требуемое вещественное значение изменяется в диапазоне от A до B. При этом нижней границе соответствует целое значение A', получаемое от устройства, верхней границе – целое значение B', получаемое от устройства, а нулевому вещественному значению соответствует 0, получаемый от устройства. Значения A' и B' устанавливаются производителем устройства.</p>

    <p>Если старший бит полученного значения X равен 0, т.е. X является положительным, то вещественное значение вычисляется по формуле:</p>

    <p>X * B / B'.</p>

    <p>Если старший бит полученного значения X равен 1, т.е. X является отрицательным, то вещественное значение вычисляется по формуле:</p>

    <p>(~X | 128 + 1) * A / (~A' | 128 + 1),<br />где ~ - оператор побитового отрицания, | - оператор побитового ИЛИ.</p>

    <p>Пример:<br />A = -210, A' = 56482 (0xDCA2), B = 760, B' = 32767 (0x7FFF).</p>

    <p>Тогда формула для ввода в базу конфигурации:<br />Cnl&lt;32768 ? Cnl*760/32767 : -(double)(ushort)(~(ushort)Cnl|128+1)*210/9182</p>

    <p>Рекомендуется создать функцию, выполняющую описанный пересчёт, в таблице <em>Формулы</em> базы конфигурации, чтобы сократить последующую запись формул при многократном использовании:</p>

    <pre><code class="language-cs">double Convert(double x)
{
    return x&lt;32768 ? x*760/32767 : -(double)(ushort)(~(ushort)x|128+1)*210/9182;
}</code></pre>

    <p>Вызов этой функции в поле <em>Формула</em> таблицы <em>Входные каналы</em>:<br /><code>Convert(Cnl)</code></p>
</div>
